defmodule EliPhxPlay.Repo.Migrations.CreateMessages do
  use Ecto.Migration

  def change do
    # 创建消息表，存储所有聊天消息
    create table(:messages, primary_key: false) do
      # 消息唯一标识符
      add :message_id, :binary_id, primary_key: true, comment: "消息唯一标识符"

      # 发送者用户ID，外键关联users表，限制删除（保留消息记录）
      add :sender_id, references(:users, column: :user_id, type: :binary_id, on_delete: :restrict),
          comment: "发送者用户ID"

      # 聊天对象ID，可能是用户ID（私聊）或群聊ID（群聊）
      add :chat_id, :binary_id, null: false, comment: "聊天对象ID(用户ID或群聊ID)"

      # 聊天类型：private(私聊)、group(群聊)
      add :chat_type, :string, null: false, comment: "聊天类型: private/group"

      # 消息类型：text(文本)、image(图片)、file(文件)、voice(语音)等
      add :message_type, :string, null: false, default: "text",
          comment: "消息类型: text/image/file/voice等"

      # 消息内容，必填，支持长文本
      add :content, :text, null: false, comment: "消息内容"

      # 额外数据，JSON格式，存储文件大小、时长等扩展信息
      add :extra_data, :map, default: %{}, comment: "额外数据(JSON格式)"

      # 自动添加创建时间和更新时间
      timestamps()
    end

    # 为发送者ID创建索引，快速查询用户发送的消息
    create index(:messages, [:sender_id], comment: "发送者消息查询索引")

    # 为聊天对象ID创建索引，快速查询特定聊天的消息
    create index(:messages, [:chat_id], comment: "聊天消息查询索引")

    # 为聊天类型创建索引，区分私聊和群聊消息
    create index(:messages, [:chat_type], comment: "聊天类型索引")

    # 为创建时间创建索引，支持时间范围查询
    create index(:messages, [:inserted_at], comment: "消息时间索引")

    # 创建复合索引，支持按聊天和时间排序查询
    create index(:messages, [:chat_id, :inserted_at], comment: "聊天时间复合索引")
  end
end
